package dy

import (
	"context"
	v1 "dy_spider/api/dy/v1"
	"dy_spider/internal/model"
	"fmt"
	"github.com/docker/docker/api/types/container"
	"github.com/docker/docker/client"
	"github.com/gogf/gf/v2/errors/gerror"
	"github.com/gogf/gf/v2/frame/g"
)

func (s *sDy) GetSpiderScriptRun(ctx context.Context, req *v1.GetSpiderScriptRunReq) (res *v1.GetSpiderScriptRunRes, err error) {
	if g.IsEmpty(req.LiveId) {
		return res, gerror.New("请输入直播间ID")
	}
	// 创建 Docker 客户端
	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
	if err != nil {
		return res, gerror.Newf("无法创建 Docker 客户端: %v", err)
	}

	dockerCtx := context.Background()

	// 启动容器并传递参数
	resp, err := cli.ContainerCreate(dockerCtx, &container.Config{
		Image: "dy_spider_script:latest", // 使用我们之前构建的镜像
		Cmd:   []string{req.LiveId},      // 在这里传递命令行参数
	}, &container.HostConfig{AutoRemove: true}, nil, nil, fmt.Sprintf("dy_spider_script_%s", req.LiveId))
	if err != nil {
		return res, gerror.Newf("无法创建容器: %v", err)
	}

	// 启动容器
	if err := cli.ContainerStart(dockerCtx, resp.ID, container.StartOptions{}); err != nil {
		return res, gerror.Newf("无法启动容器: %v", err)
	}

	return res, nil
}

func (s *sDy) GetSpiderScriptList(ctx context.Context, req *v1.GetSpiderScriptListReq) (res *v1.GetSpiderScriptListRes, err error) {
	// 创建 Docker 客户端
	res = new(v1.GetSpiderScriptListRes)
	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
	if err != nil {
		return res, gerror.Newf("无法创建 Docker 客户端: %v", err)
	}

	// 创建上下文
	dockerCtx := context.Background()

	// 获取运行中的容器列表
	containers, err := cli.ContainerList(dockerCtx, container.ListOptions{})
	if err != nil {
		return res, gerror.Newf("无法获取容器列表: %v", err)
	}
	// 创建一个切片，用于存储容器信息的结构体
	// 遍历容器列表，将每个容器的信息封装进结构体
	for _, c := range containers {
		info := model.DockerContainerInfo{
			ID:     c.ID[:10], // 只截取前10个字符的容器ID
			Name:   c.Names[0],
			Image:  c.Image,
			Status: c.Status,
		}
		// 将结构体存入切片
		res.Res = append(res.Res, info)
		// 遍历并输出容器信息
	}
	return
}

func (s *sDy) GetSpiderScriptKill(ctx context.Context, req *v1.GetSpiderScriptKillReq) (res *v1.GetSpiderScriptKillRes, err error) {
	if g.IsEmpty(req.LiveId) {
		return res, gerror.New("请输入直播间ID")
	}
	// 创建 Docker 客户端
	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
	if err != nil {
		return res, gerror.Newf("无法创建 Docker 客户端: %v", err)
	}
	dockerCtx := context.Background()
	containerName := fmt.Sprintf("dy_spider_script_%s", req.LiveId)

	// 获取所有运行中的容器
	containers, err := cli.ContainerList(dockerCtx, container.ListOptions{})
	if err != nil {
		return res, gerror.Newf("无法获取容器列表: %v", err)
	}

	// 查找匹配名称的容器
	var containerID string
	for _, c := range containers {
		for _, name := range c.Names {
			// Docker 会在容器名称前面自动加上一个斜杠，比如 "/my_container_name"
			if name == "/"+containerName {
				containerID = c.ID
				break
			}
		}
	}

	// 如果找不到指定名称的容器
	if containerID == "" {
		return res, gerror.Newf("无法获取容器列表: %v", err)
	}

	// 停止找到的容器
	timeout := 10
	err = cli.ContainerStop(dockerCtx, containerID, container.StopOptions{Timeout: &timeout})
	if err != nil {
		return res, gerror.Newf("无法关闭容器: %v", err)
	}

	return
}
